import time

import pyautogui

from my_package.file_utils import get_prefix_directory_pk
from my_package.xqol_utils import get_window_monitor, find_btn_location_once, resource_path, find_btn_location_window, \
    get_game_windows, capture_and_save_screenshot, capture_and_save_screenshot_by_window
from datetime import datetime

current_date = datetime.now().strftime('%Y-%m-%d')

# 背包
bei_bao_img_path = resource_path("images/ring_pk_img/3_bei_bao.png")
# 入场券
ticket_img_path = resource_path("images/ring_pk_img/lv_29_quan.png")
# 使用按钮
use_img_path = resource_path("images/ring_pk_img/use.png")
# 比武结束场景
end_img_path = resource_path("images/ring_pk_img/end_btn.png")
# 自动按钮
auto_btn_img_path = resource_path("images/ring_pk_img/auto_btn.png")
# 确认按钮
confirm_btn_img_path = resource_path("images/ring_pk_img/confirm_btn.png")
# 取消按钮
cancel_btn_img_path = resource_path("images/ring_pk_img/cancel_btn.png")
# 存入仓库
store_img_path = resource_path("images/ring_pk_img/store_btn.png")

def sign_up_account_list(account_list):
    """
    【根据账号】批量报名
    :param account_list: 账号列表
    :return:
    """
    if account_list is None or len(account_list) == 0:
        print("请传入需要购买入场券的账号")
        return False
    windows = get_game_windows(account_list)
    if len(windows) == 0:
        print("请先运行xqApp程序")
        return False
    # 快速报名
    sign_up_fast(windows)
    return True

def sign_up_fast(windows=None, click_use=True):
    """
    【快速报名】
    :param: windows 窗口集合
    :param: click_use: 依次找到入场券的使用按钮后，是否依次点击
    :return:
    """
    if windows is None or len(windows) == 0:
        print("请传入需要批量报名的窗口")
        exit()
    # 定义存放查找背失败的窗口
    not_find_bei_bao_windows = []
    # 定义存放查找入场券失败的窗口
    not_find_ticket_windows = []
    # 点击背包
    for window in windows:
        # TODO 如果已经在背包场景
        # 先判断是不是默认场景
        #if not is_default_screen(window):
            #return_default_screen(window)
        # 在默认场景中，依次点击背包按钮
        res_bei_bao = find_btn_location_window(window, bei_bao_img_path)
        if len(res_bei_bao) == 0:
            print(window.title, "没有找到背包按钮,跳过")
            not_find_bei_bao_windows.append(window)
        else:
            pyautogui.click(window.left + res_bei_bao[0] + 5, window.top + res_bei_bao[1] + 3)
    # 延迟一下，等待背包界面打开（时长自行调整）
    time.sleep(0.5)
    print("已经全部打开背包界面")
    # 查找入场券
    for window in windows:
        try:
            # 将窗口激活并置顶
            window.activate()
        except Exception as e:
            print("窗口操作失败：", e)
        # 定义截图区域
        _monitor = get_window_monitor(window)
        # 递归查找入场券
        time.sleep(0.3)
        print(window.title, "开始查找入场券")
        _res_coupon = find_coupon(_monitor)
        print(window.title, "入场券查找结果", _res_coupon)
        if _res_coupon and len(_res_coupon) > 0:
            # 鼠标点击
            pyautogui.click(window.left + _res_coupon[0] + 20, window.top + _res_coupon[1] + 7)
            # 再次点击（就会出现使用按钮）
            pyautogui.click(window.left + _res_coupon[0] + 20, window.top + _res_coupon[1] + 7)
        else:
            not_find_ticket_windows.append(window)
    print("已经全部查找到入场券")
    # 延迟一下
    time.sleep(0.5)
    print("重新找下是否真的有[使用]按钮")
    # 存放报名成功的窗口
    sign_up_windows = []
    # 重新找下是否真的有[使用]按钮
    for window in windows:
        # 查找【使用】入场券的按钮
        res_use = find_btn_location_window(window, use_img_path)
        # 如果有，使用！
        if res_use and len(res_use) > 0:
            # 确认使用
            if click_use:
                pyautogui.click(window.left + res_use[0], window.top + res_use[1])
                sign_up_windows.append(window)
    return sign_up_windows



def sign_up(window, click_use=True):
    """
    报名
    :param window: 窗口
    :param click_use: 窗口
    :return:
    """
    # 激活窗口
    time.sleep(0.5)
    try:
        # 将窗口激活并置顶
        window.activate()
    except Exception as e:
        print("窗口操作失败：", e)
    # 如果当前是比武结束场景
    time.sleep(1)
    res_end = find_btn_location_window(window, end_img_path)
    if res_end:
        print(window.title, "准备报名，但当前是比武结束场景,直接进入pK逻辑即可")
        pk(window)
        return
    # 如果是战斗场景
    res_auto = find_btn_location_window(window, auto_btn_img_path)
    if res_auto:
        print(window.title, "准备报名，但当前是战斗场景，直接进入pK逻辑即可")
        pk(window)
        return
    # 定义截图区域
    monitor = get_window_monitor(window)
    window_x_main = monitor["left"]
    window_y_main = monitor["top"]
    # 找背包的位置
    res_bei_bao = find_btn_location_once(monitor, bei_bao_img_path)
    print("查找背包", res_bei_bao)
    # 如果没有找到，提前返回
    if len(res_bei_bao) == 0:
        return None
    x_bei_bao_btn, y_bei_bao_btn = res_bei_bao
    print(window.title, "找到了[背包]按钮,位置：", x_bei_bao_btn, y_bei_bao_btn)
    # 鼠标移动过去
    pyautogui.moveTo(x_bei_bao_btn + window_x_main + 5, y_bei_bao_btn + window_y_main + 3)
    # 点击背包按钮
    pyautogui.click()
    # 去找[英雄入场券]
    print(window.title, "成功打开了背包，开始去找[英雄入场券]")
    time.sleep(0.6)
    res_coupon = find_coupon(monitor)
    if  res_coupon is None:
        print(window.title, "没有找到[英雄入场券]")
        return None
    print(window.title, "成功找到[英雄入场券]", res_coupon)
    # 鼠标移动过去
    time.sleep(2.5)
    pyautogui.moveTo(res_coupon[0] + window_x_main + 20, res_coupon[1] + window_y_main + 7)
    # 点击[英雄入场券]
    pyautogui.click()
    # 再次点击选中它
    time.sleep(1)
    pyautogui.click()
    # 找[使用]按钮
    time.sleep(1)
    res_use = find_btn_location_once(monitor, use_img_path)
    print(window.title, "找到了[使用]按钮吗", res_use, len(res_use))
    if len(res_use) > 0:
        if click_use:
            pyautogui.moveTo(res_use[0] + window_x_main + 5, res_use[1] + window_y_main + 5)
            pyautogui.click()
            print(window.title, " 报名成功")
        return res_use
    else:
        print(window.title, "没有找到使用按钮，再次尝试一次")
        # 实际情况种，还出现了点击到了其它物品，就会出现【存入仓库】
        res_store = find_btn_location_window(window, store_img_path)
        if len(res_store) > 0:
            # 点击取消按钮
            time.sleep(0.3)
            res_cancel = find_btn_location_window(window, cancel_btn_img_path)
            if len(res_cancel) > 0:
                pyautogui.click(window.left + res_cancel[0] + 3, window.top + res_cancel[1] + 2)
        # 重新找[使用]
        time.sleep(0.5)
        res_use_again = find_btn_location_window(window, use_img_path)
        if len(res_use_again) > 0:
            if click_use:
                pyautogui.moveTo(res_use[0] + window_x_main + 5, res_use[1] + window_y_main + 5)
                pyautogui.click()
                print(window.title, " 报名成功")
            return res_use
    return None


def find_coupon(monitor_coupon, max_attempts=30, attempt_count=0):
    """
    寻找入场券，最多尝试指定次数。
    :param monitor_coupon: 监控区域（截图范围）
    :param max_attempts: 最大尝试次数，默认为5次
    :param attempt_count: 当前尝试次数（递归使用）
    :return: 如果找到入场券，返回其位置 (x, y)，否则返回 None
    """
    if attempt_count >= max_attempts:
        print(f"已达到最大尝试次数 {max_attempts}，未找到入场券。")
        return None
    time.sleep(0.5)
    res_data_coupon = find_btn_location_once(monitor_coupon, ticket_img_path)
    if res_data_coupon:
        return res_data_coupon[0], res_data_coupon[1]
    else:
        print("没有找到入场券，重新查找")
        time.sleep(1)
        # 向下移动，按下三次下箭头键，每次间隔 0.2 秒
        pyautogui.press('down', presses=1, interval=0.1)
        time.sleep(1)
        return find_coupon(monitor_coupon, max_attempts, attempt_count + 1)


def pk(window=None, msg=False, is_click_cancel_btn=False, save_pk_end_img=False, count=0):
    """
    PK
    :param window: 窗口
    :param msg: 是否打印调试信息
    :param is_click_cancel_btn: 在比武结束场景，点击取消按钮，而不是确认按钮！！！（一般在匹配次数减去1时改为true）为true时，
    :param save_pk_end_img: 是否保存比武结束场景图片
    :param count: 第几次匹配
    :return: True、False
    """
    if window is None:
        exit("请传入窗口对象")
    # 激活窗口
    try:
        # 将窗口激活并置顶
        window.activate()
    except Exception as e:
        print("窗口操作失败：", e)
    # 判断是否比武结束
    res_end = find_btn_location_window(window, end_img_path)
    # 如果不是比武结束场景
    if len(res_end) == 0:
        if msg:
            print(window.title, "非比武结束场景，说明可能等待匹配中，也可能当前是双方PK场景，等待中...")
        # 去找图
        time.sleep(0.2)
        res_auto = find_btn_location_window(window, auto_btn_img_path)
        if len(res_auto) > 0:
            # 截图
            if save_pk_end_img:
                print(window.title, "保存比武结束场景图片")
                capture_and_save_screenshot_by_window(get_prefix_directory_pk(window.title),
                                                      str(count + 1) + "_battle.png",
                                                      window=window)
            if msg:
                print(window.title, "找到了自动按钮")
            x_auto, y_auto = res_auto
            pyautogui.moveTo(x_auto + window.left + 3, y_auto + window.top + 3)
            pyautogui.click()
        else:
            if msg:
                print(window.title, "没有找到自动按钮, 当前可能处于等待匹配场景中")
    else:
        print(window.title, " 当前处于比武结束场景")
        if save_pk_end_img:
            print(window.title, "保存比武结束场景图片")
            capture_and_save_screenshot_by_window(get_prefix_directory_pk(window.title),
                                                  str(count + 1) + "_end.png",
                                                  window=window)
        if is_click_cancel_btn:
            print(window.title, " 匹配次数减去1时改为true，点击取消按钮")
            res_cancel = find_btn_location_window(window, cancel_btn_img_path)
            if len(res_cancel) > 0:
                pyautogui.click(window.left + res_cancel[0] + 3, window.top + res_cancel[1] + 2)
            return True
        # 找战斗结束后的确认按钮
        res_confirm = find_btn_location_window(window, confirm_btn_img_path)
        if len(res_confirm) > 0:
            x_confirm, y_confirm = res_confirm
            if msg:
                print(window.title, " 找到确认按钮", x_confirm, y_confirm)
            pyautogui.moveTo(x_confirm + window.left + 10, y_confirm + window.top + 5)
            pyautogui.click()
            return True
        else:
            print(window.title, "没有找到比武场景中的左边的确认按钮")
            return False

def pk_by_account_list(account_list, num=40):
    """
    根据账号快速进入pk

    :param account_list: 账号
    :param num: 匹配战斗的次数
    :return:
    """
    if account_list is None or len(account_list) == 0:
        print("请传入需要匹配的账号")
        return False
    windows = get_game_windows(account_list)
    if len(windows) == 0:
        print("请先运行xqApp程序")
        return False
    for window in windows:
        # 定义主号PK的场次
        count = 0
        # 定义主号处于比武结束场景时，是否点击取消按钮，而不是确认按钮
        click_cancel_btn = False
        if count == num - 1:
            click_cancel_btn = True
            print("主号", window.title, "已进入", count, "次，即将点击取消按钮")
        flag1 = pk(window, msg=False, is_click_cancel_btn=click_cancel_btn)
        if flag1:
            count += 1
            print("=====================", window.title, "战斗结束了。已经完成", count, "次匹配 =====================")


def pk_by_account_list_vip(account_list, num=40):
    """
    根据账号快速进入pk，并限制每个账号最多进行num次匹配

    :param account_list: 账号列表，如 ["user1", "user2"]
    :param num: 每个账号最大匹配次数，默认为40次
    :return: 如果所有窗口处理完成返回 True，否则返回 False

    功能说明:
        - 使用字典记录每个窗口已完成的PK次数；
        - 达到指定次数后不再对该窗口执行PK；
        - 自动移除已完成匹配的窗口；
        - 所有窗口完成后自动结束循环。
    """
    if not account_list:
        print("请传入需要匹配的账号")
        return False

    windows = get_game_windows(account_list)
    if not windows:
        print("请先运行xqApp程序")
        return False

    # 用于记录每个窗口已完成的PK次数
    window_pk_count = {window.title: 0 for window in windows}

    while True:
        active_windows = []

        for window in windows:
            count = window_pk_count[window.title]
            if count >= num:
                print(f"{window.title} 已完成 {num} 次匹配，跳过...")
                continue

            # 判断是否结束最後一次匹配
            is_click_cancel_btn =  False
            if num - 1 == window_pk_count[window.title]:
                is_click_cancel_btn = True

            # 执行 pk
            result = pk(window, msg=False, is_click_cancel_btn=is_click_cancel_btn)
            if result:
                window_pk_count[window.title] += 1  # 成功完成一次匹配
                print(f"{window.title} 当前已完成匹配次数：{window_pk_count[window.title]}")
            active_windows.append(window)

        # 更新 windows 列表，移除已完成匹配的窗口
        windows = [w for w in active_windows if window_pk_count[w.title] < num]

        if not windows:
            print("所有窗口已完成指定匹配次数，任务结束")
            break

        time.sleep(1)  # 控制循环频率